/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package reputacao;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author marapao
 */
public class ReputacaoSocial {

    private List<DadosReputacaoSocial> reputacao;

    public ReputacaoSocial(List<DadosReputacaoSocial> reputacao) {
        this.reputacao = reputacao;
    }

    public ReputacaoSocial() {
        this.reputacao = new ArrayList<DadosReputacaoSocial>();
    }

    public List<DadosReputacaoSocial> getReputacao() {
        return reputacao;
    }

    public void setReputacao(List<DadosReputacaoSocial> reputacao) {
        this.reputacao = reputacao;
    }

    public void remove(String alvo) {
        List<DadosReputacaoSocial> remocao = new ArrayList<DadosReputacaoSocial>();

        for (DadosReputacaoSocial dados : reputacao) {
            if (dados.getAgenteAlvo().equals(alvo)) {
                remocao.add(dados);
            }
        }

        reputacao.removeAll(remocao);

    }

    public void insere(DadosReputacaoSocial dados) {
        remove(dados.getAgenteAlvo());
        reputacao.add(dados);

    }

    //função que retorna os tipos de reputação existentes
    public List<String> reputacoes(List<DadosReputacaoIndividual> dados) {
        List<String> reputacoes = new LinkedList<String>();
        boolean esta = false;

        for (DadosReputacaoIndividual d : dados) {
            esta = false;
            for (String string : reputacoes) {
                if (d.getTipo().equals(string)) {
                    esta = true;
                    break;
                }
            }
            if (!esta) {
                reputacoes.add(d.getTipo());
            }

        }

        return reputacoes;

    }

    public List<String> agentesAlvo(List<DadosReputacaoIndividual> dados) {
        List<String> agentesAlvo = new LinkedList<String>();
        boolean esta = false;

        for (DadosReputacaoIndividual d : dados) {
            esta = false;
            for (String string : agentesAlvo) {
                if (d.getAgenteAlvo().equals(string)) {
                    esta = true;
                    break;
                }
            }

            if (!esta) {
                agentesAlvo.add(d.getAgenteAlvo());
            }
        }

        return agentesAlvo;

    }

    public void atualiza(List<DadosReputacaoIndividual> dados) {

        double totalReputação = 0;//variável que armazena a soma das reputações de um determinado tipo
        long tempo = 0;

        List<String> reputacoes = reputacoes(dados);
        List<String> agentesAlvo = agentesAlvo(dados);
        DadosReputacaoSocial aux = new DadosReputacaoSocial();


        for (String rep : reputacoes) {
            for (String agente : agentesAlvo) {
                for (DadosReputacaoIndividual dadosReputacaoIndividual : dados) {

                    if (dadosReputacaoIndividual.getAgenteAlvo().equals(agente) && dadosReputacaoIndividual.getTipo().equals(rep)) {
                        totalReputação += dadosReputacaoIndividual.getValor() * dadosReputacaoIndividual.getTempo();
                        tempo += dadosReputacaoIndividual.getTempo();
                    }
                }
                aux.setAgenteAlvo(agente);
                aux.setTempo(System.currentTimeMillis());
                aux.setTipo(rep);
                aux.setValor(totalReputação / tempo);

                insere(aux);
            }

        }

    }

    public DadosReputacaoSocial reputacaoSocial(String agenteAlvo, String tipo){
        for (DadosReputacaoSocial drs : reputacao) {
            if(drs.getAgenteAlvo().equals(agenteAlvo)
                    && drs.getTipo().equals(tipo))
                return drs;
        }
        return null;
    }
}
